package com.ll19.thread.test.demo1;

/****
 * 
 * 
 * 同步：synchronized的用法
 * 
 * 模拟银行中的多个线程同时对同一 个储蓄账户进行存款、取款操作的。
 * 
 * 在程序中我们使用了一个简化版本的Account类，代表了一个银行账户的信息。在主程序中我们首先生成了
 * 1000个线程，然后启动它们，每一个线程都对John的账户进行存100元，然后马上又取出100元。这样，对于John的账户来说，最终账户的余额应
 * 该是还是1000元才对。
 * 
 * 
 * @author liukai
 * 
 */
public class Account {
	String name;
	float amount;

	public Account(String name, float amount) {
		this.name = name;
		this.amount = amount;
	}

	/**
	 * 
	 * 存款
	 * 
	 * @param amt
	 */
	public synchronized void deposit(float amt) {
		float tmp = amount;
		tmp += amt;

		try {
			Thread.sleep(1);// 模拟其它处理所需要的时间，比如刷新数据库等
		} catch (InterruptedException e) {
			// ignore
		}

		amount = tmp;
	}

	/**
	 * 
	 * 取款
	 * 
	 * @param amt
	 */
	public synchronized void withdraw(float amt) {
		float tmp = amount;
		tmp -= amt;

		try {
			Thread.sleep(1);// 模拟其它处理所需要的时间，比如刷新数据库等
		} catch (InterruptedException e) {
			// ignore
		}

		amount = tmp;
	}

	/**
	 * 
	 * 余额 getBalance()并不会修改amount的值，同时多个线程对它访问不会造成数据的混乱。不需要用synchronized
	 * 
	 * @return
	 */
	public float getBalance() {
		return amount;
	}
}
